package com.example.java_websocket.web.websocket;


import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.example.java_websocket.model.ChatHistory1;
import com.example.java_websocket.service.IChatHistoryService;
import com.example.java_websocket.util.SpringContextHolder;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@ServerEndpoint(value = "/chat1") //定义一个 WebSocket 服务端点
@Component //记一个类为 Spring 的组件（Bean）。Spring 会自动扫描并管理这个类的实例。
public class Chat1WebSocket {
    // session缓存
    final static Map<String, Session> sessionMap = new HashMap<>();

    /**
     * 获取 chatHistoryService 服务
     */
    IChatHistoryService getHistoryService(){

        return SpringContextHolder.getBean(IChatHistoryService.class);
    }
  public Chat1WebSocket (){
      System.out.println("载入 Chat1WebSocket 构造方法");
  }

 @OnOpen
    public void openConn(Session session){
      String sessionId=session.getId();
     System.out.println("建立ws连接: {}"+sessionId);
     sessionMap.put(sessionId,session);
 }

 @OnClose
    public void onClose (Session session, CloseReason reason){
      String reasonlist=reason.getReasonPhrase();
     String sessionId=session.getId();
     System.out.println("关闭ws连接: {}, reason: {}"+ sessionId+ reasonlist);
     sessionMap.remove(sessionId);
     System.out.println("当前连接数: " + sessionMap.size());
 }
    /**
     * 收到文本消息时调用
     */
    @OnMessage
    public void echoTextMessage(Session session, String message) {
        if (session.isOpen()) {
            System.out.println("收到ws消息: " + message);
            // 给所有ws客户端广播消息
            sessionMap.values().forEach(otherSession -> {
                try {
                    //使用 BasicRemote 发送文本消息。
                    otherSession.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    System.out.println("广播消息发生异常: "+e.getMessage());
                }
            });

            // 解析用户发送过来的json格式消息内容
            // 如果用户发送了非json数据,会导致异常.
            try {
                //将接收到的消息解析为 JSON 对象。
                JSONObject jsonObject = JSONUtil.parseObj(message);
                //将 JSON 对象转换为 ChatHistory1 实体对象。
                ChatHistory1 chatHistory = jsonObject.toBean(ChatHistory1.class);
                //获取聊天记录服务。
                IChatHistoryService historyService = getHistoryService();
                historyService.add(chatHistory);
            }catch (Exception e){
                System.err.println("解析json格式异常, json:"+message);
            }
        }
    }



}
